package com.wanshu.sys.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.wanshu.common.annotation.SysLogger;
import com.wanshu.sys.entity.SysMenu;
import com.wanshu.sys.model.SysRoleQueryDto;
import com.wanshu.common.util.PageUtils;
import com.wanshu.sys.entity.SysRole;
import com.wanshu.sys.mapper.SysRoleMapper;
import com.wanshu.sys.model.res.roleMenuTree.RoleMenuTreeRes;
import com.wanshu.sys.service.ISysMenuService;
import com.wanshu.sys.service.ISysRoleService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.List;

/**
 * <p>
 * 角色 服务实现类
 * </p>
 *
 * @author 波哥
 * @since 2023-05-09
 */
@Service
public class SysRoleServiceImpl extends ServiceImpl<SysRoleMapper, SysRole> implements ISysRoleService {

    @Resource
    private SysRoleMapper sysRoleMapper;

    @Resource
    private ISysMenuService sysMenuService;

    /**
     * 分页查询
     *
     * @param sysRoleQueryDto 系统角色查询dto
     * @return {@link PageUtils }
     * @author 张颖辉（zyh）
     * @date 2023/06/01
     * @version 1.0.0
     */
    @Override
    public PageUtils<SysRole> queryPage(SysRoleQueryDto sysRoleQueryDto) {
        //这里只是演示，为了避免魔法值硬编码，可以使用 LambdaQueryWrapper
        QueryWrapper<SysRole> wrapper = new QueryWrapper<SysRole>()
                .like(StringUtils.isNotEmpty(sysRoleQueryDto.getRoleName()), "role_name", sysRoleQueryDto.getRoleName());
        Page<SysRole> page = this.page(sysRoleQueryDto.page(), wrapper);
        return new PageUtils<SysRole>(page);
    }

    /**
     * 是否存在角色名
     * 是否存在角色名称，但不是当前的角色
     *
     * @param sysRole 角色名
     * @return {@link Boolean }
     * @author 张颖辉（zyh）
     * @date 2023/05/31
     * @version 1.0.0
     */
    @Override
    public Boolean existRoleName(SysRole sysRole) {
        LambdaQueryWrapper<SysRole> queryWrapper = new LambdaQueryWrapper();
        queryWrapper.eq(StringUtils.isNotBlank(sysRole.getRoleName()), SysRole::getRoleName, sysRole.getRoleName())
                .ne(sysRole.getRoleId() != null, SysRole::getRoleId, sysRole.getRoleId());
        int count = this.count(queryWrapper);
        return count > 0;
    }

    @SysLogger("新增或修改系统角色")
    @Transactional
    @Override
    public void saveRole(SysRole sysRole) {
        /* 1 保存角色信息 */
        // 判断角色编号是否存在，如果存在就走更新的逻辑。否则新增数据
        if (sysRole.getRoleId() != null) {
            //表示更新操作
            this.update(sysRole);
        } else {
            sysRole.setCreateTime(LocalDateTime.now());
            this.save(sysRole);
        }
        /* 2 删除角色绑定的旧菜单，保存新的角色菜单关联数据 */
        /* 2.1 删除角色菜单关联关系的旧数据*/
        sysRoleMapper.deleteRoleMenuByRoleId(sysRole.getRoleId());
        /* 2.2 保存角色菜单关联数据*/
        final List<Long> menuIds = sysRole.getMenuIds();
        for (Long menuId : menuIds) {
            sysRoleMapper.insertRoleMenu(sysRole.getRoleId(),menuId);
        }

    }

    @Override
    public void update(SysRole sysRole) {
        this.baseMapper.updateById(sysRole);
    }

    @SysLogger("删除系统角色")
    @Override
    public Boolean deleteById(Long roleId) {
        //删除角色
        //如果角色绑定了菜单或者分配给了用户，都不可以删除
        int count = this.baseMapper.canDeleteRole(roleId);
        if (count == 0) {
            baseMapper.deleteById(roleId);
        }
        return count == 0;
    }

    @Override
    public List<SysRole> queryByUserId(Long userId) {
        return sysRoleMapper.queryByUserId(userId);
    }

    @Override
    public RoleMenuTreeRes dispatcherRoleMenu(Long roleId) {
        RoleMenuTreeRes res = new RoleMenuTreeRes();
             // 1、全部菜单
         List<SysMenu> parentMenu = sysMenuService.listParentMenu();
        for (SysMenu menu : parentMenu) {
//            MenuNode node = new MenuNode();
//            node.setId(menu.getMenuId());
//            node.setName(menu.getName());
            //MenuNode n  =  getChildrenMenu(menu.getMenuId());
            sysMenuService.getChildrenMenu(menu);
        }
        res.setMenus(parentMenu);

        // 2、根据角色菜单查询角色关联的菜单
        List<Long> menuIds = sysRoleMapper.queryMenuIdByRoleId(roleId);
        res.setRoleAuthedMenuIds(menuIds);

        return res;
    }


}
